package pe.com.cotelasa.seguridad.controlador;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.primefaces.event.TransferEvent;
import org.primefaces.model.DualListModel;
import org.springframework.context.annotation.Scope;

import com.thoughtworks.xstream.XStream;
import java.util.Date;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;

import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.dominio.common.helper.SelectOneMenuHelper;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioCadenas;
import pe.com.cotelasa.scp.controlador.IMantenedor;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.excepcion.ModelExcepcion;
import pe.com.cotelasa.scp.entidad.Empresa;
import pe.com.cotelasa.scp.seguridad.modelo.UsuarioModel;
import pe.com.cotelasa.seguridad.common.util.Constantes;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKUsuario;
import pe.com.cotelasa.seguridad.entidad.Rol;
import pe.com.cotelasa.seguridad.entidad.Usuario;

@Named("MBUsuario")
@Scope("request")
public class MBUsuario extends MBGenerico implements IMantenedor, Serializable {

    private static final long serialVersionUID = 7763651480661834960L;
    private static Logger logger = Logger.getLogger(MBUsuario.class);
    @Inject
    private BKUsuario bkUsuario;
    @Autowired
    private BKSession bkSession;
    @Inject
    private UsuarioModel usuarioModel;

    public MBUsuario() {
    }

    public String mostrarMantenimiento() {
        bkUsuario.setUsuarioBusqueda(new Usuario());
        bkUsuario.setListaUsuarios(null);
        return URLPaginacion.Usuario.URL_LISTA_USUARIO;
    }

    public void buscar() {
        try {
            bkUsuario.setListaUsuarios(usuarioModel.buscarListaUsuariosActivos(bkUsuario.getUsuarioBusqueda()));

            if (bkUsuario.getListaUsuarios().isEmpty()) {
                bkUsuario.setListaUsuarios(null);
            }
        } catch (ModelExcepcion ex) {
            mostrarError(serviceProperties.getProperty("cotelasa.message.errorListar"));
            logger.error(ex.getMessage(), ex);
        }
    }

    @Override
    public String nuevo() {
        this.bkUsuario.setComando(new ComandoGuardar(this));
        bkUsuario.setUsuarioFormulario(new Usuario());
        bkUsuario.setEmpresaSeleccionada(new Empresa());
        bkUsuario.setEdicion(false);
        bkUsuario.setFormatearContracena(true);
        bkUsuario.getUsuarioFormulario().setIdRol(new Rol());
        this.cargarValoresInicialesFormulario();
        return URLPaginacion.Usuario.URL_FORMULARIO_USUARIO;
    }

    @Override
    public String editar() {
        this.bkUsuario.setComando(new ComandoActualizar(this));
        bkUsuario.setEdicion(true);
        bkUsuario.setFormatearContracena(false);
        
        try {
            bkUsuario.setUsuarioFormulario(usuarioModel.obtenerUsuario(bkUsuario.getUsuarioSeleccionado().getId()));
            System.out.println("contraseña entrar: "+bkUsuario.getUsuarioFormulario().getContracena());
            cargarValoresInicialesFormulario();
            return URLPaginacion.Usuario.URL_FORMULARIO_USUARIO;
        } catch (ModelExcepcion ex) {
            mostrarError(serviceProperties.getProperty("cotelasa.message.errorCargar"));
            logger.error(ex.getMessage(), ex);
            return mostrarMantenimiento();
        }
    }

    @Override
    public String guardar() {
        String URL;
        try {


            Map<String, Object> datos = (Map<String, Object>) usuarioModel.validarUsuario(bkUsuario.getUsuarioFormulario());
            String mensaje = (String) datos.get("mensaje");
            boolean valido = (Boolean) datos.get("valido");
            System.out.println("valido: " + valido);
            System.out.println("mensaje: " + mensaje);
            if (valido) {

                String contracenaAleatoria = "";
                if (bkUsuario.isFormatearContracena()) {
                    contracenaAleatoria = UtilitarioCadenas.generadorCadenaAleatorio();
                    bkUsuario.getUsuarioFormulario().setContracena(contracenaAleatoria);
                }
                bkUsuario.getUsuarioFormulario().setUsrCreacion(bkSession.getUsuario().getUsuario());
                bkUsuario.getUsuarioFormulario().setFecCreacion(new Date());

                usuarioModel.guardarUsuario(bkUsuario.getUsuarioFormulario(), bkUsuario.getListaEmpresa().getTarget() , bkUsuario.isFormatearContracena());
                mostrarMensaje(serviceProperties.getProperty("cotelasa.message.guardar"));
                buscar();
                URL = URLPaginacion.Usuario.URL_LISTA_USUARIO;

                if (bkUsuario.isFormatearContracena()) {
                    usuarioModel.enviarCorreoUsuario(bkUsuario.getUsuarioFormulario(), contracenaAleatoria);
                }

            } else {
                mostrarError(mensaje);
                URL = URLPaginacion.Usuario.URL_FORMULARIO_USUARIO;
            }




            return URL;

        } catch (ModelExcepcion ex) {
            mostrarError(serviceProperties.getProperty("cotelasa.message.errorGuardar"));
            logger.error(ex.getMessage(), ex);
            cargarValoresInicialesFormulario();
            return URLPaginacion.Usuario.URL_FORMULARIO_USUARIO;
        }
    }

    @Override
    public String actualizar() {
        try {
            String URL;
            String contracenaAleatoria = "";
            System.out.println("contraseña actualizar: "+bkUsuario.getUsuarioFormulario().getContracena());
            
            System.out.println("tipo de rol: "+bkUsuario.getUsuarioFormulario().getIdRol().getId());
            Map<String, Object> datos = (Map<String, Object>) usuarioModel.validarUsuario(bkUsuario.getUsuarioFormulario());
            String mensaje = (String) datos.get("mensaje");
            boolean valido = (Boolean) datos.get("valido");
            System.out.println("valido: " + valido);
            System.out.println("mensaje: " + mensaje);
            if (valido) {
                System.out.println("tipo de rol 2 : "+bkUsuario.getUsuarioFormulario().getIdRol().getId());
                if (bkUsuario.isFormatearContracena()) {
                    System.out.println("entra porque reseteo 1");
                    contracenaAleatoria = UtilitarioCadenas.generadorCadenaAleatorio();
                    bkUsuario.getUsuarioFormulario().setContracena(contracenaAleatoria);
                }
                bkUsuario.getUsuarioFormulario().setFecModificacion(new Date());
                bkUsuario.getUsuarioFormulario().setUsrModificacion(bkSession.getUsuario().getUsuario());
                usuarioModel.guardarUsuario(bkUsuario.getUsuarioFormulario(), bkUsuario.getListaEmpresa().getTarget() , bkUsuario.isFormatearContracena());
                mostrarMensaje(serviceProperties.getProperty("cotelasa.message.actualizar"));

                if (bkUsuario.isFormatearContracena()) {
                    System.out.println("entra porque reseteo 2");
                    usuarioModel.enviarCorreoUsuario(bkUsuario.getUsuarioFormulario(), contracenaAleatoria);
                }
                buscar();
                URL = URLPaginacion.Usuario.URL_LISTA_USUARIO;

            } else {
                mostrarError(mensaje);
                URL = URLPaginacion.Usuario.URL_FORMULARIO_USUARIO;
            }

            return URL;
        } catch (ModelExcepcion ex) {
            mostrarError(serviceProperties.getProperty("cotelasa.message.errorActualizar"));
            logger.error(ex.getMessage(), ex);
            cargarValoresInicialesFormulario();
            return URLPaginacion.Usuario.URL_FORMULARIO_USUARIO;
        }
    }

    @Override
    public String ver() {
        editar();
        return URLPaginacion.Usuario.URL_VER_USUARIO;
    }

    @Override
    public void eliminar(ActionEvent event) {
        try {
            usuarioModel.eliminarUsuario(bkUsuario.getUsuarioSeleccionado().getId());
            bkUsuario.setListaUsuarios(usuarioModel.buscarListaUsuariosActivos(bkUsuario.getUsuarioBusqueda()));
            mostrarMensaje(serviceProperties.getProperty("cotelasa.message.eliminar"));
        } catch (ModelExcepcion ex) {
            mostrarError(serviceProperties.getProperty("cotelasa.message.errorEliminar"));
            logger.error(ex.getMessage(), ex);
        }
    }

    @Override
    public String retroceder() {
        return URLPaginacion.Usuario.URL_LISTA_USUARIO;
    }

    @Override
    public String aceptar() {
        return URLPaginacion.Usuario.URL_LISTA_USUARIO;
    }

    @Override
    public String cancelar() {
        return URLPaginacion.Usuario.URL_LISTA_USUARIO;
    }

    private void cargarValoresInicialesFormulario() {
        try {
            this.bkUsuario.setListaRol(SelectOneMenuHelper.listaRoles((List<Rol>) usuarioModel.listaRolesActivos()));
        } catch (ModelExcepcion ex) {
            mostrarError(serviceProperties.getProperty("cotelasa.message.errorCargarRoles"));
            logger.error(ex.getMessage(), ex);
        }
        try {
            List<Empresa> source = new ArrayList<Empresa>();
            List<Empresa> target = new ArrayList<Empresa>();
            List<List<Empresa>> listaEmpresas = usuarioModel.obtenerDualListasEmpresasPorUsuario(this.bkUsuario.getUsuarioFormulario().getId());
            System.out.println("empresas derecha: " + listaEmpresas.get(0));
            for (Empresa empresaD : listaEmpresas.get(0)) {
                System.out.println("empresa derecha: " + empresaD);
                source.add(empresaD);
            }
            System.out.println("empresas izquierda: " + listaEmpresas.get(1));
            for (Empresa empresaI : listaEmpresas.get(1)) {
                System.out.println("empresa izquierda: " + empresaI);
                target.add(empresaI);
            }

            this.bkUsuario.setListaEmpresa(new DualListModel<Empresa>(source, target));
        } catch (ModelExcepcion ex) {
            mostrarError(serviceProperties.getProperty("cotelasa.message.errorCargarEmpresa"));
            logger.error(ex.getMessage(), ex);
        }
    }

    public void onTransfer(TransferEvent event) {
        StringBuilder builder = new StringBuilder();
        for (Object item : event.getItems()) {
            builder.append(((Empresa) item).getRazonSocial()).append("<br />");
        }
        System.out.println("" + builder);
    }
}
